/*********************************************************************************
FileName: RingBuffCore.h

Description: header pour les fonctions qui gerent le buffer circulaire
			 et la description des structures utilises. Le buffer circulaire
			 est de type FIFO

Authors: Vincent Leger et Francisco Jesus Ramos Reyes

Last Modification: 28-10-2012

Modifications: --
*********************************************************************************/

#ifndef _RINGBUFFCORE_H_
#define _RINGBUFFCORE_H_

#include "includes.h"
#include "definitions.h"

/*******************STRUCTURES***************************************************/
struct BufStruct {
	unsigned int 	InIdx;
	unsigned int 	OutIdx;
	unsigned short 	BufFull;
	unsigned short 	BufEmpty;
	unsigned int 	BufSize;
	unsigned char	*Buffer;
}Buffer;

struct Buf_Dev {
	unsigned char		*ReadBuf;
	unsigned char 		*WriteBuf;
	struct semaphore	SemBuf;
	unsigned short 		numWriter;
	unsigned short 		numReader;
	dev_t				dev;
	struct cdev			cdev;
	struct semaphore    SemRead;
	//struct semaphore    SemWrite;
} BDev;

/*******************TYPE DEFINITIONS********************************************/

/*********************************************************************************
Function name : int BufIn(struct BufStruct *Buf, unsigned char *Data);
Brief: -Cette fonction gere les entree dans le buffer circulaire.
	   -Un index est maintenu en memoir pour connaitre l'emplacement memoire
	   	ou l'on peut commencer a ecrire du data.


Inputs: struct BufStruct *Buf --> Pointeur vers la structure BufStruct ou les
								  differantes information du buffer sont garde.
		unsigned char *Data)  --> Pointeur de la source qui contient le data
								  a mettre dans le buffer circulaire.
Outputs: int
Return value: int --> utilise pour le retour de code d'erreur

Last modified: 28-10-2012
notes: exemple d'utilisation et call out -- BufIn(&Buffer,BDev.WriteBuf+i);
*********************************************************************************/
int BufIn(struct BufStruct *Buf, unsigned char *Data);

/*********************************************************************************
Function name : int BufOut(struct BufStruct *Buf, unsigned char *Data);
Brief: -Cette fonction gere les sortie dans le buffer circulaire.
	   -Un index est maintenu en memoir pour connaitre l'emplacement memoire
	   	du prochain element qui doit sortir du buffer.


Inputs: struct BufStruct *Buf --> Pointeur vers la structure BufStruct ou les
								  differantes information du buffer sont garde.
		unsigned char *Data)  --> Pointeur Pointeur de la destination ou
								  le data sort sera garde.
Outputs: int
Return value: int --> utilise pour le retour de code d'erreur

Last modified: 28-10-2012
notes: exemple d'utilisation et call out -- BufOut(&Buffer,BDev.ReadBuf+i);
*********************************************************************************/
int BufOut(struct BufStruct *Buf, unsigned char *Data);

/*********************************************************************************
Function name : int BufReInit(struct BufStruct *Buf);
Brief: -Cette fonction est utilise pour faire la reinitialisation du buffer
		circulaire (valeur par defaut).
	   -La commande THEBUFFER_IOCTL_RESET dans buf_ioctl appelle cette
	    fonction.


Inputs: struct BufStruct *Buf --> Pointeur vers la structure BufStruct ou les
								  differantes information du buffer sont garde.

Outputs: int
Return value: int --> utilise pour le retour de code d'erreur

Last modified: 28-10-2012
notes: exemple d'utilisation et call out -- BufReInit(&Buffer);
*********************************************************************************/
int BufReInit(struct BufStruct *Buf);

/*********************************************************************************
Function name : int BufResize(struct BufStruct *Buf, int newSize);
Brief: -Cette fonction sert a definir une nouvelle taille pour le buffer
		circulaire sans perdre de l'information.
	   -Si la nouvelle taille du buffer est plus petite que sa taille actuelle,
		une partie de l'information risque d'etre perdu.
	   -On ne peut pas allouer un espace memoire plus grand que le max absolu défini.
	   -La commande THEBUFFER_IOCTL_SET_BUFFERSIZE dans buf_ioctl appelle cette
	    fonction.


Inputs: struct BufStruct *Buf --> Pointeur vers la structure BufStruct ou les
								  differantes information du buffer sont garde.

Outputs: int
Return value: int --> utilise pour le retour de code d'erreur

Last modified: 28-10-2012
notes: exemple d'utilisation et call out -- BufResize(&Buffer, valueFromUser);
*********************************************************************************/
int BufResize(struct BufStruct *Buf, int newSize);




#endif /* _RINGBUFFCORE_H_ */
